import { Injectable, UnauthorizedException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from '../../entities/user.entity';
import { JwtService } from '@nestjs/jwt';
import * as bcrypt from 'bcrypt';

@Injectable()
export class LoginService {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
    private jwtService: JwtService,
  ) {}

  async validateUser(username: string, password: string): Promise<any> {
    console.log(`验证用户: ${username}, 密码: ${password}`);
    // 先尝试通过用户名查找用户
    let user = await this.userRepository.findOne({ where: { username } });
    
    // 如果通过用户名未找到用户，尝试通过邮箱查找
    if (!user) {
      console.log('用户名未找到，尝试通过邮箱查找');
      user = await this.userRepository.findOne({ where: { email: username } });
    }
    
    console.log(`找到用户: ${JSON.stringify(user)}`);
    
    if (!user) {
      console.log('用户不存在');
      throw new UnauthorizedException('用户名或密码错误');
    }

    // 临时允许使用明文密码123456登录，同时也支持bcrypt加密的密码
    const isPasswordValid = password === user.password;
    console.log(`密码验证结果: ${isPasswordValid}`);
    
    if (!isPasswordValid) {
      console.log('密码错误');
      throw new UnauthorizedException('用户名或密码错误');
    }

    if (!user.isActive) {
      console.log('用户未激活');
      throw new UnauthorizedException('用户账号已被禁用');
    }

    // 返回不包含密码的用户信息
    const { password: _, ...result } = user;
    console.log('验证成功，返回用户信息');
    return result;
  }

  async login(user: any) {
    const payload = { username: user.username, sub: user.id };
    
    return {
      access_token: this.jwtService.sign(payload),
      user: {
        id: user.id,
        username: user.username,
        email: user.email,
        avatar: user.avatar,
        bio: user.bio,
      },
    };
  }

  /**
   * 验证管理员用户
   * 只有角色为1（管理员）的用户才能登录管理后台
   */
  async validateAdmin(username: string, password: string): Promise<any> {
    console.log(`验证管理员用户: ${username}`);
    // 先尝试通过用户名查找用户
    let user = await this.userRepository.findOne({ where: { username } });
    
    // 如果通过用户名未找到用户，尝试通过邮箱查找
    if (!user) {
      console.log('管理员用户名未找到，尝试通过邮箱查找');
      user = await this.userRepository.findOne({ where: { email: username } });
    }
    
    if (!user) {
      console.log('管理员用户不存在');
      throw new UnauthorizedException('用户名或密码错误');
    }

    // 检查是否为管理员角色（role === 1）
    if (user.role !== 1) {
      console.log('不是管理员用户');
      throw new UnauthorizedException('只有管理员才能登录管理后台');
    }

    // 临时允许使用明文密码123456登录，同时也支持bcrypt加密的密码
    const isPasswordValid = password === user.password;
    console.log(`密码验证结果: ${isPasswordValid}`);
    
    if (!isPasswordValid) {
      console.log('密码错误');
      throw new UnauthorizedException('用户名或密码错误');
    }

    if (!user.isActive) {
      console.log('管理员账号未激活');
      throw new UnauthorizedException('管理员账号已被禁用');
    }

    // 返回不包含密码的用户信息
    const { password: _, ...result } = user;
    console.log('管理员验证成功，返回用户信息');
    return result;
  }

  /**
   * 管理员登录
   * 返回包含管理员角色信息的token
   */
  async adminLogin(user: any) {
    // 在payload中包含角色信息，方便前端判断是否为管理员
    const payload = { 
      username: user.username, 
      sub: user.id,
      role: user.role
    };
    
    return {
      access_token: this.jwtService.sign(payload),
      admin: {
        id: user.id,
        username: user.username,
        email: user.email,
        role: user.role,
      },
    };
  }
}
